package cc.wfu.trigger.http;

import cc.common.types.entity.ProductActivityEntity;
import cc.wfu.domain.product.model.aggregate.ProductPageAggregate;
import cc.wfu.domain.product.model.entity.ProductDetailEntity;
import cc.wfu.domain.product.model.entity.ProductEntity;
import cc.wfu.trigger.api.IProductApi;
import cc.wfu.trigger.api.dto.QueryProductsRequest;
import cc.wfu.types.exception.ProductAppException;
import cc.wfu.types.model.Response;
import cc.wfu.types.page.PageVO;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: jia-qiang ljq1024.cc
 * @desc: 商品服务 controller
 * @Date: 2024-05-23-20:38
 */
@Slf4j
@AllArgsConstructor
@RequestMapping("/product/")
@RestController("product_controller")
//@CrossOrigin("${app.config.cross-origin}")
public class ProductController extends ProductControllerSupport implements IProductApi {

    /**
     * 查询商品列表 - 分页，有过滤参数
     * @param request 请求参数
     * @return 返回结果
     */
    @Override
    @RequestMapping(value = "query/products", method = RequestMethod.POST)
    public Response<PageVO<ProductEntity>> queryProducts(@RequestBody QueryProductsRequest request) {
        try {
            log.info("查询商品列表 - 开始");
            // 1. 获取基本必要数据
            Integer pageNum = request.getPageNum();
            Integer pageSize = request.getPageSize();
            // 2. 参数校验
            if (pageNum == null || pageNum <= 0) request.setPageNum(1);
            if (pageSize == null || pageSize <= 0 || pageSize >= 20) request.setPageSize(20);
            // 3. 构建请求参数
            ProductPageAggregate productPageAggregate = buildProductPageAggregate(request);
            // 4. 请求数据库
            PageVO<ProductEntity> response = productService.queryProducts(productPageAggregate);

            log.info("查询商品列表 - 完成。");
            return Response.SUCCESS(response);
        } catch (ProductAppException e) {
            log.error("查询商品列表 - 出现业务异常：", e);
            return Response.APP_ERROR(e.getMessage());
        } catch (Exception e) {
            log.error("查询商品列表 - 出现未知异常：", e);
            return Response.DEFAULT_ERROR();
        }
    }


    /**
     * 查询商品的集具体信息
     */
    @Override
    @RequestMapping(value = "query/product/{productId}", method = RequestMethod.GET)
    public Response<ProductDetailEntity> queryProduct(@PathVariable("productId") String productId) {
        try {
            log.info("查询商品的集具体信息 - 开始");
            // 请求数据库
            ProductDetailEntity response = productService.queryProduct(productId);
            log.info("查询商品的集具体信息 - 完成。");
            return Response.SUCCESS(response);
        } catch (ProductAppException e) {
            log.error("查询商品列表 - 出现业务异常：", e);
            return Response.APP_ERROR(e.getMessage());
        } catch (Exception e) {
            log.error("查询商品列表 - 出现未知异常：", e);
            return Response.DEFAULT_ERROR();
        }
    }

    /**
     * 预热商品 - 查询商品信息
     * @param productId 商品ID
     */
    @Override
    @GetMapping("query/info/{productId}")
    public Response<ProductActivityEntity> queryProductEntity(@PathVariable("productId") Long productId) {
        try {
            log.info("预热商品 - 查询商品信息 - 开始");
            // 请求数据库
            ProductActivityEntity response = productService.queryProductEntity(productId);
            log.info("预热商品 - 查询商品信息 - 完成。");
            return Response.SUCCESS(response);
        } catch (ProductAppException e) {
            log.error("预热商品 - 查询商品信息 - 出现业务异常：", e);
            return Response.APP_ERROR(e.getMessage());
        } catch (Exception e) {
            log.error("预热商品 - 查询商品信息 - 出现未知异常：", e);
            return Response.DEFAULT_ERROR();
        }
    }

}
